# Copyright (C) 2026. Logiciel élaboré par l'État, via le DEPS.
# Nom des auteures : Flore Cornuet et Camille Parent, DEPS.
# Ce programme informatique a été développé par le DEPS.
# Il permet de produire les résultats du Culture Études 1-2026.

# Ce programme a été exécuté en septembre 2026 avec la version 4.5.3 de R.
# La publication peut être consultée sur le site du Deps. 
# Ce programme utilise les données du pass Culture et du recensement de la population 2022.

# Bien qu'il n'existe aucune obligation légale à ce sujet, les utilisateurs de ce programme sont
# invités à signaler au DEPS leurs travaux issus de la réutilisation de ce code, ainsi que les
# éventuels problèmes ou anomalies qu'ils y rencontreraient, en écrivant à contact.deps@culture.gouv.fr .
# Ce logiciel est régi par la licence EUPL V1.2 soumise au droit français et européen, respectant
# les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer
# ce programme sous les conditions de la licence EUPL V1.2, telle que diffusée sur
# https://eupl.eu/1.2/fr/ .
# En contrepartie de l'accessibilité au code source et des droits de copie, de modification et de
# redistribution accordés par cette licence, il n'est offert aux utilisateurs qu'une garantie
# limitée. Pour les mêmes raisons, seule une responsabilité restreinte pèse sur les auteures du
# programme, le titulaire des droits patrimoniaux et les concédants successifs.
# À cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à
# l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par
# l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à
# manipuler et qui le réserve donc à des développeurs et des professionnels avertis possédant des
# connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester
# l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de
# leurs systèmes et ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les
# mêmes conditions de sécurité.


# chargement des packages ####

library(data.table); library(tidyverse); library(glue)
library(arrow); library(duckdb); library(DBI); library(kableExtra)

# connexion duckdb ####

con <- dbConnect(duckdb())
dbExecute(con, "SET threads = 4")
dbExecute(con, "SET preserve_insertion_order = false")
dbExecute(con, "SET memory_limit = '16GB'")

# chargement des tables ####

tab_cat <- setDT(read_parquet(paste0(chemin_intermediaires, "tab_cat.parquet")))
dbExecute(con, glue("
  CREATE OR REPLACE TABLE bookings_filtres AS
  SELECT * FROM read_parquet('{chemin_intermediaires}bookings_filtres.parquet')
"))

#Fonction de recodage des catégories (MUSIQUE_LIVE -> Concerts et festivals) ####
ordre <- c("Livre","Cinéma","Concerts et festivals","Instrument de musique",
           "Musique enregistrée","Jeu","Beaux-arts","Spectacle vivant","Film","Autre")

# ---------------------------------------------------------------------------
# COLONNES 1 & 2 : répartition selon le montant du chèque (depuis tab_cat)
# champ : nés 2003-2005, création + expiration
# ---------------------------------------------------------------------------
base <- tab_cat[champ_creation == 1 &
                  champ_expiration == 1 &
                  annee_naissance %in% 2003:2005 &
                  !is.na(cat_depense)]

base[, cat_group := fcase(
  cat_depense == "LIVRE",               "Livre",
  cat_depense == "CINEMA",              "Cinéma",
  cat_depense == "MUSIQUE_LIVE",        "Concerts et festivals",
  cat_depense == "INSTRUMENT",          "Instrument de musique",
  cat_depense == "MUSIQUE_ENREGISTREE", "Musique enregistrée",
  cat_depense == "JEU",                 "Jeu",
  cat_depense == "BEAUX_ARTS",          "Beaux-arts",
  cat_depense == "SPECTACLE",           "Spectacle vivant",
  cat_depense == "FILM",                "Film",
  default = "Autre"
)]

col12 <- base[, .(depense = sum(total_depense)), by = .(chq_300, cat_group)]
col12[, part := round(depense / sum(depense) * 100), by = chq_300]
col12 <- dcast(col12, cat_group ~ chq_300, value.var = "part")
setnames(col12, c("0", "1"),
         c("Avec les chèques de moins de 300 euros", "Avec le chèque de 300 euros"))

# ---------------------------------------------------------------------------
# COLONNE 3 : ensemble des chèques (depuis bookings_filtres, niveau booking)
# champ : nés 2003-2005, dépôts créés dans la fenêtre et expirés avant le 28/02/2025
# ---------------------------------------------------------------------------
rep_ens <- dbGetQuery(con, glue("
  WITH dep AS (
    SELECT deposit_id, user_id
    FROM read_parquet('{chemin_deposit}')
    WHERE deposit_creation_date >= '2021-05-21'
      AND deposit_creation_date <  '2025-02-28'
      AND deposit_expiration_date < '2025-02-28'
  ),
  book AS (
    SELECT bf.booking_intermediary_amount AS montant,
           CASE
             WHEN bf.offer_category = 'LIVRE'               THEN 'Livre'
             WHEN bf.offer_category = 'CINEMA'              THEN 'Cinéma'
             WHEN bf.offer_category = 'MUSIQUE_LIVE'        THEN 'Concerts et festivals'
             WHEN bf.offer_category = 'INSTRUMENT'          THEN 'Instrument de musique'
             WHEN bf.offer_category = 'MUSIQUE_ENREGISTREE' THEN 'Musique enregistrée'
             WHEN bf.offer_category = 'JEU'                 THEN 'Jeu'
             WHEN bf.offer_category = 'BEAUX_ARTS'          THEN 'Beaux-arts'
             WHEN bf.offer_category = 'SPECTACLE'           THEN 'Spectacle vivant'
             WHEN bf.offer_category = 'FILM'                THEN 'Film'
             ELSE 'Autre'
           END AS cat_group
    FROM bookings_filtres bf
    JOIN dep d ON bf.deposit_id = d.deposit_id
    JOIN read_parquet('{chemin_user}') u ON bf.user_id = u.user_id
    WHERE EXTRACT(YEAR FROM u.user_birth_date) BETWEEN 2003 AND 2005
  )
  SELECT cat_group, SUM(montant) AS depense
  FROM book
  GROUP BY cat_group
"))
setDT(rep_ens)
rep_ens[, `Avec l'ensemble des chèques` := round(depense / sum(depense) * 100)]

# ---------------------------------------------------------------------------
# ASSEMBLAGE
# ---------------------------------------------------------------------------
tab2 <- merge(col12,
              rep_ens[, .(cat_group, `Avec l'ensemble des chèques`)],
              by = "cat_group", all = TRUE)
tab2 <- tab2[order(match(cat_group, ordre))]
setcolorder(tab2, c("cat_group",
                    "Avec le chèque de 300 euros",
                    "Avec les chèques de moins de 300 euros",
                    "Avec l'ensemble des chèques"))
setnames(tab2, "cat_group", "Catégorie de dépense")

# ligne total
ligne_tot <- tab2[, lapply(.SD, sum), .SDcols = is.numeric]
ligne_tot[, `Catégorie de dépense` := "Total"]
setcolorder(ligne_tot, colnames(tab2))
tab2_final <- rbind(tab2, ligne_tot)

# ---------------------------------------------------------------------------
# TABLEAU kableExtra
# ---------------------------------------------------------------------------
tab2_final |>
  kbl(
    caption = "Tableau 2 : Répartition des dépenses des bénéficiaires nés entre 2003 et 2005 par catégorie de produits culturels, en fonction du montant du chèque (en %)",
    align   = c("l", "c", "c", "c")
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE, position = "center"
  ) |>
  row_spec(nrow(tab2_final), bold = TRUE) |>
  footnote(
    general = paste0(
      "Champ : bénéficiaires nés entre 2003 et 2005, chèques créés à partir du ",
      "21 mai 2021 et expirant avant le 28 février 2025. ",
      "Source : données de l'application pass Culture."
    ),
    general_title = "", footnote_as_chunk = TRUE
  )

tab2_final

